\chapter{Interprétation du pcod}

\section{Principe d'exécution}

\subsection{Pile d'exécution}
La pile est une zone d'exécution qui va changer d'état tout au long de l'interprétation du pcod.

Composition de la pile :
\begin{verbatim}
struct pile {
  struct pile *pr ec;	// élément de la pile précédent
  struct pile *suiv;	// élément de la pile suivant
  int type;		// type de la variable
  void* ptr_val;	// pointeur vers la valeur de la variable
};
\end{verbatim}

\includegraphics[width=5cm]{pile.png}

\subsection{Compteur ordinal}

Le compteur ordinal est une variable globale qui stocke l'index de la prochaine ligne de pcod à exécuter.
Ce compteur est surtout utile pour les jump (instruction JMP) et les retour de fonction.
\begin{itemize}
  \item Le jump dans le pcod intervient lors d'un appel à une fonction ou encore pour sauter des lignes de codes à la suite d'une condition (if, while, ...). Pour sauter ces lignes de pcod, le compteur ordinal prend la valeur de la prochaine ligne de pcod à exécuter puis on se place à cette ligne avant de faire d'autre opérations.
  \item Lors d'un appel de fonction, la valeur du compteur ordinal est stockée dans la pile d'exécution. Après un retour de fonction (instruction RET), cette valeur est dépiler et remise dans le compteur ordinal. Ainsi on peut reprendre le code à la ligne après l'appel de la fonction.
\end{itemize}

\subsection{Points d'arrêts}
Les points d'arrêts sont définis par l'utilisateur dans l'interface TCL.
Si la ligne 3 est signalée comme étant un point d'arrêt, alors il faudra arrêter temporairement l'exécution du pcod à a fin de la ligne 3.
Pour reprendre à la ligne 4 on attend un signal de l'interface TCL, soit un next (pas à pas), soit un exec (stop au prochain point d'arrêt).

\section{Analyse lexicale du pcod}

Unité lexicale à l'intérieur du pcod :
\begin{itemize}
  \item \texttt{NUM\us LIGNE} : numéro de ligne du pcod
  \item \texttt{OPERATEUR} : instruction à interpréter
  \item \texttt{PARAMETRE} : le premier et deuxième paramètre de l'instruction
  \item \texttt{VIRGULE} : la virgule qui sépare les deux paramètres
  \item \texttt{COMMENTAIRE} : après chaque ligne de pcod
  \item \texttt{TABLE\us SYMBOLE} : située après le pcod \\
\end{itemize}

Exemple :
\begin{verbatim}
00004 LIT 3,1 #Constante bool
\end{verbatim}

\begin{itemize}
  \item \texttt{NUM\us LIGNE} : 00004
  \item \texttt{OPERATEUR} : LIT
  \item \texttt{PARAMETRE} : 3 et 1
  \item \texttt{VIRGULE} : ,
  \item \texttt{COMMENTAIRE} : après chaque ligne de pcod
  \item \texttt{TABLE\us SYMBOLE} : située après le pcod
\end{itemize}

\section{Instructions pcod}

Voici un listing des différentes instructions pcod qui ont été définies et exploitées pour interpreter le pcod :
\begin{itemize}
  \item LIT type,valeur : empile le contenu du littéral (constante)
  \begin{itemize}
    \item type : type de la variable
    \item valeur : valeur de la variable
  \end{itemize}
  \item INC type,i : empile une variable (réserver une zone mémoire)
  \begin{itemize}
    \item type : type de la variable
    \item i : nombre de variable à empiler
  \end{itemize}
  \item LOD type,i : empile le contenu de la variable en i
  \begin{itemize}
    \item type : type de la variable
    \item i : position de la variable dans la pile
  \end{itemize}
  \item STO type,i : dépile et fixe le contenu dans la variable en i
  \begin{itemize}
    \item type : type de la variable
    \item i : position de la variable dans la pile
  \end{itemize}
  \item OPR 0,code : opération fait sur les 2 derniers éléments de la pile et rempile le résultat
  \begin{itemize}
    \item 0 : /
    \item code : code de l'opération à exécuter (ex : 1 pour la soustraction)
  \end{itemize}
  \item SFL 0,0 : met le flag à true ou false  (stocké en dehors de la pile)
  \begin{itemize}
    \item 0 : /
    \item 0 : /
  \end{itemize}
  \item JMP 0,i : sauter à la ligne i en affectant i au compteur ordinal
  \begin{itemize}
    \item 0 : /
    \item i : position de la ligne dans la pile
  \end{itemize}
  \item JPC 0,i : si le flag est à false alors sauter à la ligne i
  \begin{itemize}
    \item 0 : /
    \item i : position de la ligne dans la pile
  \end{itemize}
  \item CAL 0,i : empiler la valeur du compteur ordinal et sauter à la ligne i
  \begin{itemize}
    \item 0 : /
    \item i : position de la ligne dans la pile
  \end{itemize}
  \item NOP 0,0 : début d'une fonction
  \begin{itemize}
    \item 0 : /
    \item 0 : /
  \end{itemize}
  \item RET 0,0 : dépile le compteur ordinal puis saute à cette valeur (retour de fonction)
  \begin{itemize}
    \item 0 : /
    \item 0 : /
  \end{itemize}
  \item STP 0,0 : fin du programme
  \begin{itemize}
    \item 0 : /
    \item 0 : /
  \end{itemize}
  \item WRT 0,0 : écrit la valeur de la pile dépiler dans la console
  \begin{itemize}
    \item 0 : /
    \item 0 : /
  \end{itemize}
  \item WRL 0,0 : écrit la valeur de la pile dépiler dans la console et va à la ligne
  \begin{itemize}
    \item 0 : /
    \item 0 : /
  \end{itemize}
  \item REA 0,0 : empile la valeur entrer par l'utilisateur dans la console
  \begin{itemize}
    \item 0 : /
    \item 0 : / \\
  \end{itemize}
\end{itemize}
Type d'opérations pour l'instruction OPR :
\begin{verbatim}
#define PLUS 	0 // +
#define MOINS 	1 // -
#define MULTI 	2 // *
#define DIV 	3 // /
#define SINF 	4 // <
#define INFOE 	5 // <=
#define SSUP 	6 // >
#define SUPOE	7 // >=
#define DIF 	8 // <>
#define EGAL 	9 // =
\end{verbatim}